package com.dlc.shop.user.common.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.dlc.shop.bean.bo.PayInfoResultBO;
import com.dlc.shop.bean.model.PayInfo;
import com.dlc.shop.bean.model.ShopCustomer;
import com.dlc.shop.bean.model.UserExtension;
import com.dlc.shop.bean.param.UserUpdateParam;
import com.dlc.shop.common.response.ServerResponseEntity;
import com.dlc.shop.user.common.dto.LevelDetailDto;
import com.dlc.shop.user.common.dto.UserLevelDto;
import com.dlc.shop.user.common.model.*;

import java.util.List;

/**
 * 会员等级
 *
 * @author LGH
 * @date 2020-02-26 16:03:14
 */
public interface UserLevelService extends IService<UserLevel> {

    /**
     * 根据会员等级类型获取会员等级列表信息
     *
     * @param userLevelType 见 枚举UserLevelType
     * @return
     */
    List<UserLevelDto> listUserLevelsByUserLevelType(Integer userLevelType);

    /**
     * 获取会员等级列表
     * @param userLevelType 会员类型
     * @param shopId 店铺id
     * @return
     */
    List<UserLevelDto> listLevel(Integer userLevelType, Long shopId);

    /**
     * 购买会员回调
     * @param payInfoResultBO
     * @param payInfo
     * @return
     */
    ServerResponseEntity<String> noticeBuyVip(PayInfoResultBO payInfoResultBO, PayInfo payInfo);

    /**
     * 购买付费会员成功处理
     *
     * @param payNo 支付单号
     * @param userLevelLog
     * @param payInfoResultBO 支付信息
     */
    void paySuccess(String payNo, UserLevelLog userLevelLog, PayInfoResultBO payInfoResultBO);

    /**
     * 增加用户成长值和积分
     *
     * @param growthPrice 增加的成长值
     * @param score    增加的积分
     * @param userId    用户id
     * @param bizId    bizId
     * @param userExtension    用户扩展信息
     * @param type    1:等级 2：余额充值
     */
    void addGrowthAndScore(double growthPrice, Long score, String userId, String bizId, UserExtension userExtension, Integer type);

    /**
     * 等级提升
     * @param userLevels 多个等级，奖励发放时
     * @param userLevelLog 等级日志,在购买付费会员时存在
     * @param user 用户详细信息
     * @param historyLevel 等级提升后的等级
     * @param beforeLevel 等级提升前的等级
     */
    void levelUp(List<UserLevel> userLevels, UserLevelLog userLevelLog, UserExtension user, Integer historyLevel, Integer beforeLevel);

    /**
     * 批量更新用户等级 - excel 导入用户
     * @param userExtensionList
     * @param userLevelList
     * @param userScoreDetailList
     * @param userScoreLogList
     */
    void batchLevelUp(List<UserExtension> userExtensionList, List<UserLevel> userLevelList, List<UserScoreDetail> userScoreDetailList, List<UserScoreLog> userScoreLogList);

    /**
     * 更新等级模板信息
     * @param userLevel 等级信息
     */
    void updateUserLevelList(UserLevel userLevel);

    /**
     * 删除等级
     * @param userLevel 等级信息
     * @return 是否删除
     */
    Boolean deleteUserLevel(UserLevel userLevel);

    /**
     * 根据等级模板，更新用户的等级信息
     * @param userLevel 等级信息
     * @return 是否成功更新
     */
    Boolean updateUserLevel(UserLevel userLevel);

    /**
     * 获取等级信息
     * @param id 等级id
     * @return 等级信息
     */
    UserLevel getUserLevelById(Long id);

    /**
     * 获取等级列表，等级包含等级关联的权限列表信息
     * @param levelType 等级类型
     * @param shopId 店铺id
     * @return 等级列表
     */
    List<LevelDetailDto> selectLevelAndRights(Integer levelType, Long shopId);

    /**
     * 批量修改用户成长值
     * @param param
     * @return
     */
    Boolean batchUpdateGrowth(UserUpdateParam param);

    /**
     * 批量修改用户积分
     * @param param
     * @return
     */
    Boolean batchUpdateScore(UserUpdateParam param);

    /**
     * 新增店铺会员等级
     * @param userLevel
     */
    void saveShopLevel(UserLevel userLevel);

    /**
     * 更新店铺会员等级
     * @param userLevel
     */
    void updateShopLevel(UserLevel userLevel);

    /**
     * 删除店铺会员等级
     * @param userLevel
     */
    void deleteShopLevel(UserLevel userLevel);

    /**
     * 刷新(更新)店铺会员等级
     * @param shopId
     */
    void refreshShopFreeLevel(Long shopId);

    /**
     * 店铺会员升级
     * @param shopCustomer
     * @param userLevel
     */
    void shopLevelUp(ShopCustomer shopCustomer, UserLevel userLevel);

    /**
     * 更新成长值
     * @param userGrowthLog
     */
    void updateShopGrowth(UserGrowthLog userGrowthLog);
    /**
     * 批量修改店铺会员的成长值
     * @param updateParam
     * @param shopId
     */
    void updateBatchShopGrowth(UserUpdateParam updateParam, Long shopId);

    /**
     * 获取指定等级及等级类型的等级数据
     * @param level
     * @param levelType
     * @param shopId
     * @return
     */
    List<UserLevel> selectLevelAndCoupons(Integer level, Integer levelType, Long shopId);

    /**
     * 修改为付费会员
     * @param userLevel
     */
    void updateRecruitStatus(UserLevel userLevel);
}
